#define _GNU_SOURCE
#include "daemon_run.h"
#include "daemon_sub_process.h"
#include <unistd.h>
#include <fcntl.h>
#include <signal.h>

static char *cmd_param[SUB_PROCESS_COUNT] = {"app","ota"};
static SubProcess *sp[SUB_PROCESS_COUNT];

static int is_running = 1;

static void exit_handler(int signum)
{
    is_running = 0;
}
int daemon_run(void)
{
    //将当前进程变为守护进程
    // 参数1 ： 0：指定工作目录为根目录 1：指定工作目录为启动目录
    // 参数2 ： 0：自动关闭标准输入输出 1：0：不关闭标准输入输出
    daemon(0, 1);

    //注册结束函数
    signal(SIGTERM, exit_handler); //kill

    //关闭标准输入输出
    close(STDIN_FILENO);
    close(STDOUT_FILENO);
    close(STDERR_FILENO);
    open("/dev/null", O_RDWR); //标准输入 返回0
    open(LOG_FILE_PATH, O_CREAT | O_WRONLY | O_APPEND, 0644);
    open(LOG_FILE_PATH, O_CREAT | O_WRONLY | O_APPEND, 0644);

    //初始化子进程对象
    for (int i = 0; i < SUB_PROCESS_COUNT; i++)
    {
        sp[i] = daemon_sub_process_init(cmd_param[i]);
    }
    //每隔一秒检查一次所有子进程启动
    while (is_running)
    {
        for (int i = 0; i < SUB_PROCESS_COUNT; i++)
        {
            daemon_sub_process_start(sp[i]);
        }
        sleep(1);
    }
    //在守护进程关闭前停止所有子进程
    for (int i = 0; i < SUB_PROCESS_COUNT; i++)
    {
        daemon_sub_process_stop(sp[i]);
    }
    
    return 0;
}